<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 1.函数都是Function的实例 本质上都是new Function得到 
    2.对象里的函数叫方法 哈哈哈-->
</head>
<script>
    //定义函数的三种方式
    //1.这个叫函数表达式 x
    var x1 = function () {
        console.log('函数表达式')
    }
    //变量只有声明提升，所以必须在赋值之后才能调用
    x1();

    //2.x2 是函数声明,函数会自动提升 可以先调用再进行定义
    x2();
    function x2() {
        console.log('函数声明');
    }

    //打印函数名 是打印Function对象
    console.log('打印函数名的结果是' + x2)

    //3.构造函数,传参string类型 所有函数都应看作 Function 类的实例
    var x3 = new Function('a', 'b', 'console.log(\'构造函数声明函数\');console.log(a+b)')
    x3(1,2);

    //立即执行函数 执行完就被释放
    (function(a,b){
        console.log('立即执行函数的结果'+(a+b))
    })(2,3);


    // js没有重载
    function testParm(a,b,c) {
        console.log('三个参数是'+a+''+b+''+c);
        console.log(arguments);
    }
    //传了四个参数，只有前3个会被用到
    testParm(1, 2, 3, 'a');

    //传2个参数，剩下两个都是undefined
    new testParm(1,2);


    // 函数返回函数
    function testReturn (){
        num = 200
        console.log('函数执行了');
        function fn2 (){
           return num 
        }
        return fn2
    }
    // 执行函数 并且把返回值fn2 赋值给x  
    var x = testReturn();


</script>

<body>

</body>

</html>
